****** How Moral Beliefs Influence Collective Violence ***********************
****** Author: Enzo Nussio
****** Publication: Comparative Political Studies
******************************************************************************

*** Analysis based on STATA 16

******************************************************************************


****** ANALYSIS IN MAIN ARTICLE **********************************************
*** GET DATA
clear
use "Replication survey data.dta"
*check data directory

set scheme s2mono

*** Figure 3 - hypothesis 1a
estimates clear
foreach var of varlist index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 {
qui reg `var' order_MFQfirst ED age female INGi
estimates store s_`var'
qui reg `var' order_MFQfirst ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_index_supportlynching, aseq(index_supportlynching) \ s_CNDH34, aseq(CNDH34) \ s_OBSF, aseq(OBSF) \ s_PARF, aseq(PARF) \ s_PEER, aseq(PEER) \ s_POLI, aseq(POLI) \ s_CNDH39, aseq(CNDH39) label(simple)) (f_index_supportlynching, aseq(index_supportlynching) \ f_CNDH34, aseq(CNDH34) \ f_OBSF, aseq(OBSF) \ f_PARF, aseq(PARF) \ f_PEER, aseq(PEER) \ f_POLI, aseq(POLI) \ f_CNDH39, aseq(CNDH39) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(index_supportlynching = "Support for lynching index" CNDH34 = "Agree with lynching" OBSF="Would stay and observe lynching" PARF="Would participate in lynching" PEER="Neighbors would encourage lynching" POLI="Would call police to denounce" CNDH39="Perpetrators should be sentenced") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small))

*** Figure 4 - hypothesis 1b
estimates clear
foreach var of varlist EMOL_suffer EMOL_condemn {
qui reg `var' order_MFQfirst ED age female INGi
estimates store s_`var'
qui reg `var' order_MFQfirst ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_EMOL_suffer, aseq(EMOL_suffer) \ s_EMOL_condemn, aseq(EMOL_condemn) label(simple)) (f_EMOL_suffer, aseq(EMOL_suffer) \ f_EMOL_condemn, aseq(EMOL_condemn) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(EMOL_suffer="Suffering for thief" EMOL_condemn="Condemning of thief") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small))

*** Figure 5 - hypothesis 2a
estimates clear
foreach var of varlist index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 {
qui reg `var' b_minus_i ED age female INGi 
estimates store s_`var'
qui reg `var' b_minus_i ED age female INGi catholic nonreligious working unemployed BASURA RESS X1 PELEA index_trustgov i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_index_supportlynching, aseq(index_supportlynching) \ s_CNDH34, aseq(CNDH34) \ s_OBSF, aseq(OBSF) \ s_PARF, aseq(PARF) \ s_PEER, aseq(PEER) \ s_POLI, aseq(POLI) \ s_CNDH39, aseq(CNDH39) label(simple)) (f_index_supportlynching, aseq(index_supportlynching) \ f_CNDH34, aseq(CNDH34) \ f_OBSF, aseq(OBSF) \ f_PARF, aseq(PARF) \ f_PEER, aseq(PEER) \ f_POLI, aseq(POLI) \ f_CNDH39, aseq(CNDH39) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(index_supportlynching = "Support for lynching index" CNDH34 = "Agree with lynching" OBSF="Would stay and observe lynching" PARF="Would participate in lynching" PEER="Neighbors would encourage lynching" POLI="Would call police to denounce" CNDH39="Perpetrators should be sentenced") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small)) 

*** Figure 6 - hypothesis 2a
estimates clear
foreach var of varlist OBSP PARP {
qui reg `var' b_minus_i ED age female INGi 
estimates store s_`var'
qui reg `var' b_minus_i ED age female INGi catholic nonreligious working unemployed BASURA RESS X1 PELEA index_trustgov i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_OBSP, aseq(OBSP) \ s_PARP, aseq(PARP)  label(simple)) (f_OBSP, aseq(OBSP) \ f_PARP, aseq(PARP) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(OBSP="Did stay and observe lynching" PARP = "Did participate in lynching") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small)) 

*** Figure 7 - hypothesis 2b
estimates clear
foreach var of varlist EMOL_suffer EMOL_condemn {
qui reg `var' b_minus_i ED age female INGi
estimates store s_`var'
qui reg `var' b_minus_i ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_EMOL_suffer, aseq(EMOL_suffer) \ s_EMOL_condemn, aseq(EMOL_condemn) label(simple)) (f_EMOL_suffer, aseq(EMOL_suffer) \ f_EMOL_condemn, aseq(EMOL_condemn) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(EMOL_suffer="Suffering for thief" EMOL_condemn="Condemning of thief") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small))


****** ANALYSIS IN APPENDIX **************************************************
*** GET DATA
clear
use "Replication survey data.dta"
*check data directory

*** A5.1. Summary statistics
estpost summarize index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 OBSP PARP EMOC_suffer EMOC_condemn EMOL_suffer EMOL_condemn order_MFQfirst index_indivi index_binding b_minus_i index_harm index_fairness index_authority index_loyalty index_purity lognombre CP8 CP6 PROT3 TERR PENA MIG REB SUI EDU IPV ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1
esttab, cell("count mean(fmt(%9.2f)) sd(fmt(%9.2f)) min(fmt(%9.2f)) max(fmt(%9.2f))") varlabels(index_supportlynching "Support for lynching index" CNDH34 "Agree with lynching" OBSF "Would stay and observe lynching" PARF "Would participate in lynching" PEER "Neighbors would encourage lynching" POLI "Would call the police to denounce" CNDH39 "Perpetrators should be sentenced" OBSP "Did stay and observe lynching" PARP "Did participate in lynching" EMOC_suffer "Suffering for neighbors" EMOC_condemn "Condemning of neighbors" EMOC_praise "Praise of neighbors" EMOL_suffer "Suffering for thief" EMOL_condemn "Condemning of thief" order_MFQfirst "Moral prime" b_minus_i "Group morality" index_indivi "Individualizing morality" index_binding "Binding morality" index_harm "Harm avoidance foundation" index_fairness "Fairness foundation" index_authority "Authority foundation" index_loyalty "Loyalty foundation" index_purity "Purity foundation" lognombre "Log of names known in colonia" CP8 "Community participation" CP6 "Participation in religious activity" PROT3 "Protest participation" TERR "Torturing suspected terrorists" PENA "Death penalty" MIG "Use of force against immigrants" REB "Taking up arms to remove corrupt mayor" SUI "Suicide" EDU "Parents allowed to beat children" IPV "Husband allowed to beat wife" ED "Education" age "Age" female "Female" INGi "Light bulbs" catholic "Catholic" nonreligious "Nonreligious" working "Working" unemployed "Unemployed" BASURA "Garbage on street" RESS "Commerce on street" PELEA "Fight" index_trustgov "Trust in government" X1 "Adjusting measurement") replace

*** A5.2. Summary statistics of colonia-level indicators
clear
use "Replication colonia data.dta"
*check data directory

estpost summarize KNOW KNOW2 lynch_event b_minus_i g_pop_tot g_pop_km2 g_area_km2  v_hom_tot BASURA if survey==1 
esttab, cell("count mean(fmt(%9.2f)) sd(fmt(%9.2f)) min(fmt(%9.2f)) max(fmt(%9.2f))") varlabels(KNOW "Respondents know of lynching in colonia" KNOW2 "Survey-reported number of lynchings in colonia" lynch_event "Newspaper-based lynching events in colonia" b_minus_i "Group morality" g_pop_tot "Population size" g_pop_km2 "Population density" g_area_km2 "Area in square kilometers" v_hom_tot "Number of homicides 2009-2020" BASURA "Garbage on street") replace

*** A5.3. Covariate balance for moral priming
clear
use "Replication survey data.dta"
*check data directory

orth_out lognombre CP8 CP6 PROT3 ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov, by(order_MFQfirst) pcompare count  bdec(3) replace

*** A5.4. Balance of morality questions depending on moral priming
orth_out index_indivi index_binding b_minus_i index_harm index_fairness index_authority index_loyalty index_purity TERR PENA MIG REB SUI EDU IPV, by(order_MFQfirst) pcompare count  bdec(3) replace

*** A5.5. Correlation matrix of lynching items (lynching support and lynching behavior)
asdoc pwcorr index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 OBSP PARP, label star(all) replace nonum(label)

*** A5.6. The effect of moral priming on lynching support: full regression output for simple model
est clear
local m=1
foreach var of varlist index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 {
eststo model_`m': qui reg `var' order_MFQfirst ED age female INGi
local m `++m'
}
esttab model_* , b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
addnote("OLS models without colonia fixed effects nor clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Support for lynching index" "Agree with lynching" "Would stay and observe lynching" "Would participate in lynching" "Neighbors would encourage lynching" "Would call police to denounce" "Perpetrators should be sentenced") ///
varlabels(order_MFQfirst "Moral prime" ED "Education" age "Age" female "Female" INGi "Light bulbs" _cons "Constant") replace

*** A5.7. The effect of moral priming on lynching support: full regression output for demanding model
est clear
local m=1
foreach var of varlist index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 {
eststo model_`m': qui reg `var' order_MFQfirst ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
local m `++m'
}
esttab model_* , b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
drop(*col) addnote("OLS models with colonia fixed effects and clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Support for lynching index" "Agree with lynching" "Would stay and observe lynching" "Would participate in lynching" "Neighbors would encourage lynching" "Would call police to denounce" "Perpetrators should be sentenced") ///
varlabels(order_MFQfirst "Moral prime" ED "Education" age "Age" female "Female" INGi "Light bulbs" catholic "Catholic" nonreligious "Nonreligious" working "Working" unemployed "Unemployed" BASURA "Garbage on street" RESS "Commerce on street" PELEA "Fight" index_trustgov "Trust in government" X1 "Adjusting measurement" _cons "Constant") replace

*** A5.8. The effect of moral priming on moral emotions: full regression output for simple models
est clear
local m=1
foreach var of varlist EMOL_suffer EMOL_condemn {
eststo model_`m': qui reg `var' order_MFQfirst ED age female INGi
local m `++m'
}
esttab model_* , b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
addnote("OLS models without colonia fixed effects nor clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Suffering for thief" "Condemning of thief") ///
varlabels(order_MFQfirst "Moral prime" ED "Education" age "Age" female "Female" INGi "Light bulbs" _cons "Constant") replace

*** A5.9. The effect of moral priming on moral emotions: full regression output for demanding models
est clear
local m=1
foreach var of varlist EMOL_suffer EMOL_condemn {
eststo model_`m': qui reg `var' order_MFQfirst ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
local m `++m'
}
esttab model_* , b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
drop(*col) addnote("OLS models with colonia fixed effects and clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Suffering for thief" "Condemning of thief") ///
varlabels(order_MFQfirst "Moral prime" ED "Education" age "Age" female "Female" INGi "Light bulbs" catholic "Catholic" nonreligious "Nonreligious" working "Working" unemployed "Unemployed" BASURA "Garbage on street" RESS "Commerce on street" PELEA "Fight" index_trustgov "Trust in government" X1 "Adjusting measurement" _cons "Constant") replace

*** A5.10. The effect of moral priming on lynching participation
estimates clear
foreach var of varlist PARP {
qui reg `var' order_MFQfirst ED age female INGi 
estimates store s_`var'
qui reg `var' order_MFQfirst ED age female INGi catholic nonreligious working unemployed BASURA RESS X1 PELEA index_trustgov i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_PARP, aseq(PARP)  label(simple)) (f_PARP, aseq(PARP) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(PARP = "Did participate in lynching") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small)) 

*** A5.11. The effect of moral priming on morality
estimates clear
foreach var of varlist index_indivi index_binding b_minus_i {
qui reg `var' order_MFQfirst ED age female INGi 
estimates store s_`var'
qui reg `var' order_MFQfirst ED age female INGi catholic nonreligious working unemployed BASURA RESS X1 PELEA index_trustgov i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_index_indivi, aseq(index_indivi) \ s_index_binding, aseq(index_binding) \ s_b_minus_i, aseq(b_minus_i) label(simple)) (f_index_indivi, aseq(index_indivi) \ f_index_binding, aseq(index_binding) \ f_b_minus_i, aseq(b_minus_i)  label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(index_indivi= "Individualizing index" index_binding = "Binding index" b_minus_i="Group morality index") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small)) order(b_minus_i index_indivi index_binding)

*** A5.12. The association between moral emotions for the target of violence and lynching support
estimates clear
foreach var of varlist index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 {
qui reg `var' EMOL_suffer EMOL_condemn ED age female INGi
estimates store s_`var'
qui reg `var' EMOL_suffer EMOL_condemn ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_index_supportlynching, aseq(index_supportlynching) \ s_CNDH34, aseq(CNDH34) \ s_OBSF, aseq(OBSF) \ s_PARF, aseq(PARF) \ s_PEER, aseq(PEER) \ s_POLI, aseq(POLI) \ s_CNDH39, aseq(CNDH39) label(simple)) (f_index_supportlynching, aseq(index_supportlynching) \ f_CNDH34, aseq(CNDH34) \ f_OBSF, aseq(OBSF) \ f_PARF, aseq(PARF) \ f_PEER, aseq(PEER) \ f_POLI, aseq(POLI) \ f_CNDH39, aseq(CNDH39) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(index_supportlynching = "Support for lynching index" CNDH34 = "Agree with lynching" OBSF="Would stay and observe lynching" PARF="Would participate in lynching" PEER="Neighbors would encourage lynching" POLI="Would call police to denounce" CNDH39="Perpetrators should be sentenced")  bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small))  eqlabels("{bf:Suffering emotions}" "{bf:Condemning emotions}", asheading)

*** A5.13. Group-oriented morals and lynching support: full regression output for simple model
est clear
local m=1
foreach var of varlist index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 {
eststo model_`m': qui reg `var' b_minus_i ED age female INGi
local m `++m'
}
esttab model_* , b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
addnote("OLS models without colonia fixed effects nor clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Support for lynching index" "Agree with lynching" "Would stay and observe lynching" "Would participate in lynching" "Neighbors would encourage lynching" "Would call police to denounce" "Perpetrators should be sentenced") ///
varlabels(b_minus_i "Group morality" ED "Education" age "Age" female "Female" INGi "Light bulbs" _cons "Constant") replace

*** A5.14. Group-oriented morals and lynching support: full regression output for demanding model
est clear
local m=1
foreach var of varlist index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 {
eststo model_`m': qui reg `var' b_minus_i ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
local m `++m'
}
esttab model_* , b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
drop(*col) addnote("OLS models with colonia fixed effects and clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Support for lynching index" "Agree with lynching" "Would stay and observe lynching" "Would participate in lynching" "Neighbors would encourage lynching" "Would call police to denounce" "Perpetrators should be sentenced") ///
varlabels(b_minus_i "Group morality" ED "Education" age "Age" female "Female" INGi "Light bulbs" catholic "Catholic" nonreligious "Nonreligious" working "Working" unemployed "Unemployed" BASURA "Garbage on street" RESS "Commerce on street" PELEA "Fight" index_trustgov "Trust in government" X1 "Adjusting measurement" _cons "Constant") replace

*** A5.15. Group-oriented morals and lynching behavior: full regression output for simple model
est clear
local m=1
foreach var of varlist OBSP PARP {
eststo model_`m': qui reg `var' b_minus_i ED age female INGi
local m `++m'
}
esttab model_* , b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
addnote("OLS models without colonia fixed effects nor clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Did stay and observe lynching" "Did participate in lynching") ///
varlabels(b_minus_i "Group morality" ED "Education" age "Age" female "Female" INGi "Light bulbs" _cons "Constant") replace

*** A5.16. Group-oriented morals and lynching behavior: full regression output for demanding model
est clear
local m=1
foreach var of varlist OBSP PARP {
eststo model_`m': qui reg `var' b_minus_i ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
local m `++m'
}
esttab model_* , b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
drop(*col) addnote("OLS models with colonia fixed effects and clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Did stay and observe lynching" "Did participate in lynching") ///
varlabels(b_minus_i "Group morality" ED "Education" age "Age" female "Female" INGi "Light bulbs" catholic "Catholic" nonreligious "Nonreligious" working "Working" unemployed "Unemployed" BASURA "Garbage on street" RESS "Commerce on street" PELEA "Fight" index_trustgov "Trust in government" X1 "Adjusting measurement" _cons "Constant") replace

*** A5.17. Binding and individualizing morality and support for lynching
estimates clear
foreach var of varlist index_supportlynching CNDH34 OBSF PARF PEER POLI CNDH39 {
qui reg `var' index_indivi index_binding ED age female INGi
estimates store s_`var'
qui reg `var' index_indivi index_binding ED age female INGi catholic nonreligious working unemployed BASURA RESS  X1 PELEA index_trustgov i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_index_supportlynching, aseq(index_supportlynching) \ s_CNDH34, aseq(CNDH34) \ s_OBSF, aseq(OBSF) \ s_PARF, aseq(PARF) \ s_PEER, aseq(PEER) \ s_POLI, aseq(POLI) \ s_CNDH39, aseq(CNDH39) label(simple)) (f_index_supportlynching, aseq(index_supportlynching) \ f_CNDH34, aseq(CNDH34) \ f_OBSF, aseq(OBSF) \ f_PARF, aseq(PARF) \ f_PEER, aseq(PEER) \ f_POLI, aseq(POLI) \ f_CNDH39, aseq(CNDH39) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed X1 PELEA index_trustgov _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(index_supportlynching = "Support for lynching index" CNDH34 = "Agree with lynching" OBSF="Would stay and observe lynching" PARF="Would participate in lynching" PEER="Neighbors would encourage lynching" POLI="Would call police to denounce" CNDH39="Perpetrators should be sentenced") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small)) eqlabels("{bf:Individualizing morality}" "{bf:Binding morality}", asheading)

*** A5.18. Binding and individualizing morality and lynching behavior
estimates clear
foreach var of varlist OBSP PARP {
qui reg `var' index_indivi index_binding  ED age female INGi 
estimates store s_`var'
qui reg `var' index_indivi index_binding  ED age female INGi catholic nonreligious working unemployed BASURA RESS X1 PELEA index_trustgov i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_OBSP, aseq(OBSP) \ s_PARP, aseq(PARP)  label(simple)) (f_OBSP, aseq(OBSP) \ f_PARP, aseq(PARP) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(OBSP="Did stay and observe lynching" PARP = "Did participate in lynching") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small)) eqlabels("{bf:Individualizing morality}" "{bf:Binding morality}", asheading) 

*** A5.19. Group-oriented morals and other forms of participation
estimates clear
foreach var of varlist CP8 CP6 PROT3 {
qui reg `var' b_minus_i ED age female INGi
estimates store s_`var'
qui reg `var' b_minus_i  ED age female INGi catholic nonreligious working unemployed BASURA RESS  X1 PELEA index_trustgov i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_CP8, aseq(CP8) \ s_CP6, aseq(CP6) \ s_PROT3, aseq(PROT3)  label(simple)) (f_CP8, aseq(CP8) \ f_CP6, aseq(CP6) \ f_PROT3, aseq(PROT3) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed X1 PELEA index_trustgov _cons) xline (0) levels(99 95 90) graphregion(col(white)) bgcol(white) coeflabels(CP8 = "Community participation" CP6 = "Participation in religious activity" PROT3 = "Protest participation") order(CP8 PROT3 CP6) bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small)) 

*** A5.20. Group-based moral beliefs and lynching on the colonia level (N=340)
clear
use "Replication colonia data.dta"
*check data directory 

set scheme s2mono
estimates clear
foreach var of varlist KNOW logknow2 loglynch_event {
qui reg `var' b_minus_i g_pop_tot g_pop_km2 g_area_km2
estimates store s_`var'
qui reg `var' b_minus_i g_pop_tot g_pop_km2 g_area_km2  v_hom_tot BASURA  i.cve_alc, cl(cve_alc)
estimates store f_`var'
}
coefplot (s_KNOW, aseq(KNOW) \ s_logknow2, aseq(logknow2) \ s_loglynch_event, aseq(loglynch_event)  label(simple)) (f_KNOW, aseq(KNOW) \ f_logknow2, aseq(logknow2) \ f_loglynch_event, aseq(loglynch_event) label(demanding)), drop(g_pop_tot g_pop_km2 g_area_km2  v_hom_tot BASURA  *cve_alc _cons) xline (0) levels(99 95 90) graphregion(col(white)) bgcol(white) coeflabels(KNOW = "Respondents know of lynching in colonia" logknow2 = "Survey-reported number of lynchings (log)" loglynch_event = "Newspaper-based lynching events (log)") bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and alcaldía fixed effects.", span size(small)) 

*** A5.21. Group-oriented morals and moral emotions: full regression output for simple model
clear
use "Replication survey data.dta"
*check data directory

est clear
local m=1
foreach var of varlist EMOL_suffer EMOL_condemn {
eststo model_`m': qui reg `var' b_minus_i ED age female INGi
local m `++m'
}
esttab model_*, b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
addnote("OLS models without colonia fixed effects nor clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Suffering for thief" "Condemning of thief") ///
varlabels(b_minus_i "Group morality" ED "Education" age "Age" female "Female" INGi "Light bulbs" _cons "Constant") replace

*** A5.22. Group-oriented morals and moral emotions: full regression output for demanding model
est clear
local m=1
foreach var of varlist EMOL_suffer EMOL_condemn {
eststo model_`m': qui reg `var' b_minus_i ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
local m `++m'
}
esttab model_*, b(2) se ar2(2) nogap onecell varwidth(7) modelwidth(7) star(* 0.05 ** 0.01 *** 0.001) ///
drop(*col) addnote("OLS models with colonia fixed effects and clustered standard errors at colonia level. N varies due to non-response.") ///
ml("Suffering for thief" "Condemning of thief") ///
varlabels(b_minus_i "Group morality" ED "Education" age "Age" female "Female" INGi "Light bulbs" catholic "Catholic" nonreligious "Nonreligious" working "Working" unemployed "Unemployed" BASURA "Garbage on street" RESS "Commerce on street" PELEA "Fight" index_trustgov "Trust in government" X1 "Adjusting measurement" _cons "Constant") replace

*** A5.23. Moral emotions for target and lynching behavior 
estimates clear
foreach var of varlist OBSP PARP {
qui reg `var' EMOL_suffer EMOL_condemn ED age female INGi
estimates store s_`var'
qui reg `var' EMOL_suffer EMOL_condemn ED age female INGi catholic nonreligious working unemployed BASURA RESS PELEA index_trustgov X1 i.col, cl(cve_col)
estimates store f_`var'
}
coefplot (s_OBSP, aseq(OBSP) \ s_PARP, aseq(PARP)  label(simple)) (f_OBSP, aseq(OBSP) \ f_PARP, aseq(PARP) label(demanding)), drop(ED age female INGi *col BASURA RESS  catholic nonreligious working unemployed   PELEA index_trustgov X1 _cons) xline (0) levels(99 95 90) graphregion(col(white)) coeflabels(OBSP="Did stay and observe lynching" PARP = "Did participate in lynching")   bgcol(white) aseq swapnames note("Note: OLS regression coefficients with 99, 95 and 90% confidence intervals. Simple model includes" "limited number of control variables. Demanding model with additional control variables, clustered" "standard errors and colonia fixed effects.", span size(small))  eqlabels("{bf:Suffering emotions}" "{bf:Condemning emotions}", asheading)
